//Trie节点定义
function TrieNode() {
    this.next = {};
    this.isEnd = false;
}
//Trie树定义
function Trie() {
    this.root = new TrieNode();
}

//插入单词操作
Trie.prototype.insert = function (word) {
    if (!word) return false;
    let len = word.length;
    let node = this.root;
    for (let i = 0; i < len; i++){
        if(node.next[word[i]]){
            node = node.next[word[i]]
        }else{
            node.next[word[i]] = new TrieNode();
            node = node.next[word[i]];
        }
    }
    node.isEnd = true;
    return true;
}

//判断单词是否存在操作
Trie.prototype.has = function(word){
    if(!word) return false;
    let node = this.root;
    let len = word.length;
    for(let i = 0;i < len;i++){
        if(node.next[word[i]]){
            node = node.next[word[i]];
        }else{
            return false;
        }
    }
    return node.isEnd;
}
//判断这个单词是否在Trie树中存在某一个单词，这个单词是它的前缀
Trie.prototype.isStart = function(prefix){
    if(!prefix) return false;
    let node = this.root;
    let len = prefix.length;
    for(let i = 0;i < len;i++){
        if(node.next[prefix[i]]){
            node = node.next[prefix[i]];
        }else{
            return false;
        }
    }
    return true;
}

let trie = new Trie();
trie.insert("hello");
trie.insert("hi");
trie.insert("word");
console.log(trie.has("hell"));
console.log(trie.has("hello"));
console.log(trie.isStart("hell"));